From: Sebastian Keller Date: Sat, 17 Apr 2021 17:53:43 +0000 (+0200) Subject: dnd: Don't try to restore to parent location if parent got destroyed X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~616^2^2~30 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=79acae41769ab46a3d11851c64e14779a3035bd2;p=gnome-shell.git dnd: Don't try to restore to parent location if parent got destroyed The original parent of a dragged actor might have been destroyed after the drag has been started. When the drag is canceled and _dragOrigParent is set, the code is trying to get the current position and size of it when restoring. With a destroyed parent this however would result in a crash. This could happen for example when starting a drag on a window preview while the overview is hiding and then releasing it once the transition is done. Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4024 Part-of: --- diff --git a/js/ui/dnd.js b/js/ui/dnd.js index 0af1e7ecc..03b56915f 100644 --- a/js/ui/dnd.js +++ b/js/ui/dnd.js @@ -407,6 +407,10 @@ var _Draggable = class _Draggable { Main.uiGroup.add_child(this._dragActor); Main.uiGroup.set_child_above_sibling(this._dragActor, null); Shell.util_set_hidden_from_pick(this._dragActor, true); + + this._dragOrigParentDestroyId = this._dragOrigParent.connect('destroy', () => { + this._dragOrigParent = null; + }); } this._dragActorDestroyId = this._dragActor.connect('destroy', () => { @@ -776,6 +780,11 @@ var _Draggable = class _Draggable { this._dragActor = null; } + if (this._dragOrigParent) { + this._dragOrigParent.disconnect(this._dragOrigParentDestroyId); + this._dragOrigParent = null; + } + this._dragState = DragState.INIT; currentDraggable = null; }